/******************************
 * @Developer: many
 * @File: datetime.go
 * @Time: 2022/6/22 9:57
******************************/

package util

import "time"

// Now 获取当前时间戳
func Now() int64 {
	return time.Now().Unix()
}

// ToWeek 时间戳 转 周
func ToWeek(nt int64) time.Weekday {
	return time.Unix(nt, 0).Weekday()
}

// FmtStr 时间、日期 格式化字符串
type FmtStr string

const (
	TIME     = FmtStr("15:04:05")            // 时间
	DATE     = FmtStr("2006-01-02")          // 日期
	DATETIME = FmtStr("2006-01-02 15:04:05") // 日期 时间
)

// ToUnix 日期、时间、日期时间 转 时间戳
func ToUnix(dt string, fmtstr FmtStr) int64 {
	tt, err := time.Parse(dt, string(fmtstr))
	if err != nil {
		panic(err)
	}
	return tt.Unix()
}

// ToDateTime 时间戳转 日期、时间、日期时间
func ToDateTime(nt int64, fmtstr FmtStr) string {
	return time.Unix(nt, 0).Format(string(fmtstr))
}

// WithOffset 设置时间偏移量
type WithOffset func(offset ...int)

// YearOffset 时间偏移量 - 时
func HourOffset(hour int) WithOffset {
	return func(offset ...int) {
		offset[0] = hour % 24
	}
}

// YearOffset 时间偏移量 - 分
func MinOffset(min int) WithOffset {
	return func(offset ...int) {
		offset[1] = min % 60
	}
}

// YearOffset 时间偏移量 - 秒
func SecOffset(sec int) WithOffset {
	return func(offset ...int) {
		offset[2] = sec % 60
	}
}

// ZERO 获取一个时间0点的 偏移 时间戳
func ZERO(nt int64, withoffset ...WithOffset) int64 {
	var hour, min, sec, nsec int

	for idx := range withoffset {
		withoffset[idx](hour, min, sec)
	}

	nd := time.Unix(nt, 0)
	zd := time.Date(
		nd.Year(), nd.Month(), nd.Day(), hour, min, sec, nsec, time.Local,
	)

	return zd.Unix()
}
